using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._PointCloud._Classification
{
    /// <summary>
    /// <para>Classify Point Cloud Using Trained Model</para>
    /// <para>Classifies a point cloud using a PointCNN classification model.</para>
    /// <para>使用 PointCNN 分类模型对点云进行分类。</para>
    /// </summary>    
    [DisplayName("Classify Point Cloud Using Trained Model")]
    public class ClassifyPointCloudUsingTrainedModel : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public ClassifyPointCloudUsingTrainedModel()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_point_cloud">
        /// <para>Target Point Cloud</para>
        /// <para>The point cloud that will be classified.</para>
        /// <para>将要分类的点云。</para>
        /// </param>
        /// <param name="_in_trained_model">
        /// <para>Input Model Definition</para>
        /// <para>The input Esri model definition file (*.emd) or deep learning package (*.dlpk) that will be used to classify the point cloud. A web address for a deep learning package that is published on ArcGIS Online or ArcGIS Living Atlas can also be used.</para>
        /// <para>将用于对点云进行分类的输入 Esri 模型定义文件 （*.emd） 或深度学习包 （*.dlpk）。还可以使用在 ArcGIS Online 或 ArcGIS Living Atlas 上发布的深度学习包的 Web 地址。</para>
        /// </param>
        /// <param name="_output_classes">
        /// <para>Target Classification</para>
        /// <para>The class codes from the trained model that will be used to classify the input point cloud. All classes from the input model will be used by default unless a subset is specified.</para>
        /// <para>来自训练模型的类代码，将用于对输入点云进行分类。默认情况下，将使用输入模型中的所有类，除非指定了子集。</para>
        /// </param>
        public ClassifyPointCloudUsingTrainedModel(object _in_point_cloud, object _in_trained_model, List<object> _output_classes)
        {
            this._in_point_cloud = _in_point_cloud;
            this._in_trained_model = _in_trained_model;
            this._output_classes = _output_classes;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Classify Point Cloud Using Trained Model";

        public override string CallName => "3d.ClassifyPointCloudUsingTrainedModel";

        public override List<string> AcceptEnvironments => ["extent", "geographicTransformations", "gpuID", "outputCoordinateSystem", "processorType"];

        public override object[] ParameterInfo => [_in_point_cloud, _in_trained_model, _output_classes, _in_class_mode.GetGPValue(), _target_classes, _compute_stats.GetGPValue(), _boundary, _update_pyramid.GetGPValue(), _out_point_cloud];

        /// <summary>
        /// <para>Target Point Cloud</para>
        /// <para>The point cloud that will be classified.</para>
        /// <para>将要分类的点云。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target Point Cloud")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_point_cloud { get; set; }


        /// <summary>
        /// <para>Input Model Definition</para>
        /// <para>The input Esri model definition file (*.emd) or deep learning package (*.dlpk) that will be used to classify the point cloud. A web address for a deep learning package that is published on ArcGIS Online or ArcGIS Living Atlas can also be used.</para>
        /// <para>将用于对点云进行分类的输入 Esri 模型定义文件 （*.emd） 或深度学习包 （*.dlpk）。还可以使用在 ArcGIS Online 或 ArcGIS Living Atlas 上发布的深度学习包的 Web 地址。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Model Definition")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_trained_model { get; set; }


        /// <summary>
        /// <para>Target Classification</para>
        /// <para>The class codes from the trained model that will be used to classify the input point cloud. All classes from the input model will be used by default unless a subset is specified.</para>
        /// <para>来自训练模型的类代码，将用于对输入点云进行分类。默认情况下，将使用输入模型中的所有类，除非指定了子集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target Classification")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _output_classes { get; set; }


        /// <summary>
        /// <para>Existing Class Code Handling</para>
        /// <para><xdoc>
        ///   <para>Specifies how the editable points from the input point cloud will be defined.</para>
        ///   <bulletList>
        ///     <bullet_item>EDIT_ALL—All points in the input point cloud will be edited. This is the default.</bullet_item><para/>
        ///     <bullet_item>EDIT_SELECTED—Only points with class codes specified in the Existing Class Codes parameter will be edited; all other points remain unchanged.</bullet_item><para/>
        ///     <bullet_item>PRESERVE_SELECTED—Points with class codes specified in the Existing Class Codes parameter will be preserved; the remaining points will be edited.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定如何定义输入点云中的可编辑点。</para>
        ///   <bulletList>
        ///     <bullet_item>EDIT_ALL—将编辑输入点云中的所有点。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>EDIT_SELECTED—仅编辑在现有类代码参数中指定了类代码的点;所有其他要点保持不变。</bullet_item><para/>
        ///     <bullet_item>PRESERVE_SELECTED—将保留在现有类代码参数中指定类代码的点;其余点将被编辑。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Existing Class Code Handling")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _in_class_mode_value _in_class_mode { get; set; } = _in_class_mode_value._EDIT_ALL;

        public enum _in_class_mode_value
        {
            /// <summary>
            /// <para>Edit All Points</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Edit All Points")]
            [GPEnumValue("EDIT_ALL")]
            _EDIT_ALL,

            /// <summary>
            /// <para>Edit Selected Points</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Edit Selected Points")]
            [GPEnumValue("EDIT_SELECTED")]
            _EDIT_SELECTED,

            /// <summary>
            /// <para>Preserve Selected Points</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Preserve Selected Points")]
            [GPEnumValue("PRESERVE_SELECTED")]
            _PRESERVE_SELECTED,

        }

        /// <summary>
        /// <para>Existing Class Codes</para>
        /// <para>The classes for which points will be edited or have their original class code designation preserved based on the Existing Class Code Handling parameter value.</para>
        /// <para>将编辑其点的类，或根据现有类代码处理参数值保留其原始类代码名称的类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Existing Class Codes")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _target_classes { get; set; } = null;


        /// <summary>
        /// <para>Compute statistics</para>
        /// <para><xdoc>
        ///   <para>Specifies whether statistics will be computed for the .las files referenced by the LAS dataset. Computing statistics provides a spatial index for each .las file, which improves analysis and display performance. Statistics also enhance the filtering and symbology experience by limiting the display of LAS attributes, such as classification codes and return information, to values that are present in the .las file.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—Statistics will be computed. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Statistics will not be computed.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定是否为 LAS 数据集引用的 .las 文件计算统计数据。计算统计为每个 .las 文件提供空间索引，从而提高分析和显示性能。统计数据还通过将 LAS 属性（如分类代码和返回信息）的显示限制为 .las 文件中存在的值来增强过滤和符号系统体验。</para>
        ///   <bulletList>
        ///     <bullet_item>选中—将计算统计数据。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中—不计算统计数据。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Compute statistics")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _compute_stats_value _compute_stats { get; set; } = _compute_stats_value._true;

        public enum _compute_stats_value
        {
            /// <summary>
            /// <para>COMPUTE_STATS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("COMPUTE_STATS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_COMPUTE_STATS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_COMPUTE_STATS")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Processing Boundary</para>
        /// <para>The polygon boundary that defines the subset of points to be processed from the input point cloud. Points outside the boundary features will not be evaluated.</para>
        /// <para>定义要从输入点云处理的点的子集的多边形边界。不会对边界要素之外的点进行评估。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Processing Boundary")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _boundary { get; set; } = null;


        /// <summary>
        /// <para>Update pyramid</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the LAS dataset pyramid will be updated after the class codes are modified.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—The LAS dataset pyramid will be updated. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—The LAS dataset pyramid will not be updated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定修改类代码后是否更新 LAS 数据集金字塔。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 将更新 LAS 数据集金字塔。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中—LAS 数据集金字塔将不会更新。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Update pyramid")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _update_pyramid_value _update_pyramid { get; set; } = _update_pyramid_value._true;

        public enum _update_pyramid_value
        {
            /// <summary>
            /// <para>UPDATE_PYRAMID</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("UPDATE_PYRAMID")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NO_UPDATE_PYRAMID</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_UPDATE_PYRAMID")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Output Point Cloud</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Point Cloud")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_point_cloud { get; set; }


        public ClassifyPointCloudUsingTrainedModel SetEnv(object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null)
        {
            base.SetEnv(extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem);
            return this;
        }

    }

}